package com.mini.mybatis.mybatisministep01.binding;

import java.lang.reflect.Proxy;
import java.util.Map;

/**
 *  1. MapperProxyFactory构造器，传入想要生成代理的mapper的类模板，完成初始化
 *  2. 通过newInstance方法，传入sqlSession对象，为目标mapper接口生成代理,并返回代理对象。
 *  tips：
 *      实现了invocationHandler方法的接口（mapperProxy），即是传入Proxy的第三个参数，其中的invoke()方法也是真正实现增强逻辑的地方
 * @param <T>
 */
public class MapperProxyFactory<T> {

    private final Class<T> mapperInterface;

    public MapperProxyFactory(Class<T> mapperInterface) {
        this.mapperInterface = mapperInterface;
    }

    public T newInstance(Map<String,Object> sqlSession){
        final MapperProxy<T> mapperProxy = new MapperProxy<>(sqlSession,mapperInterface);
        return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(),new Class[]{mapperInterface},mapperProxy);
    }
}
